const utils = {};

// 接口参数 使用& 连接
utils['qsStringify'] = (obj) => {
    var str = '';

    for(let k in obj) {
        str += `${k}=${obj[k]}&`;
    }

    return str = str.substring(0, str.length - 1);
};

utils['indexToChinese'] = (index) => {
	const chineseNumbers = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
	const chineseUnits = ['', '十', '百', '千', '万']; // 中文单位

	let result = ''; // 最终结果

	// 处理索引小于十的情况
	if (index < 10) {
		result += chineseNumbers[index];
	} else {
		// 根据索引的位数添加中文数字和单位
		const digits = index.toString().length;
		for (let i = 0; i < digits; i++) {
			const num = Math.floor(index / Math.pow(10, digits - i - 1)) % 10; // 获取当前位的数字
			
			if (num !== 0) {
				result += chineseNumbers[num - 1] + chineseUnits[digits - i - 1];
			}
		}
	}
  return result;
}

// 是否是JSON对象
utils['isJsonObj'] = (str) => {
	try {
		if (typeof JSON.parse(str) == "object") {
			return true;
		}
	} catch (e) {}
	return false;
};

// 时间毫秒格式化处理  1700069608185000 ==>  2020-10-30 09:30:00
utils['formartDate'] = (originVal, fmt) => {
	const dt = new Date(originVal)
	const opt = {
		yyyy: dt.getUTCFullYear(),
		MM: (dt.getUTCMonth() + 1 + '').padStart(2, '0'),
		dd: (dt.getUTCDate() + '').padStart(2, '0'),
		HH: (dt.getUTCHours() + '').padStart(2, '0'),
		mm: (dt.getUTCMinutes() + '').padStart(2, '0'),
		ss: (dt.getUTCSeconds() + '').padStart(2, '0')
	}

	for (const k in opt) {
		const ret = new RegExp('(' + k + ')').exec(fmt)
		if (ret) {
			fmt = fmt.replace(ret[1], opt[k])
		}
	}

	return fmt
};

// 消息体的时间戳 
utils['formatMsgTime'] = (duration, flag) => {
	let result = '', old = Number(duration);
	const NOW = new Date()
	const PAST = new Date(old)

	if (flag) {
		result = utils.formartDate(old, 'yyyy-MM-dd HH:mm');
	} else {
		// 判断是当天的时间 显示格式 10：30
		if (NOW.toDateString() === PAST.toDateString()) {
			result = utils.formartDate(old, 'HH:mm')
		// 时间为当年 显示月日 时间戳
		} else if (PAST.getUTCFullYear() === NOW.getUTCFullYear()) {
			result = utils.formartDate(old, 'MM-dd HH:mm')
		} else {
			result = utils.formartDate(old, 'yyyy-MM-dd')
		}
	}

	return result;
};

//number,rpx,upx,px,% --> px的数值
utils['toPx'] = (num, windowHeight) => {
	if (typeof num === 'string') {
		if (num.indexOf('px') !== -1) {
			if (num.indexOf('rpx') !== -1) {
				// "10rpx"
				num = num.replace('rpx', '');
			} else if (num.indexOf('upx') !== -1) {
				// "10upx"
				num = num.replace('upx', '');
			} else {
				// "10px"
				return Number(num.replace('px', ''));
			}
		} else if (num.indexOf('%') !== -1) {
			// 传百分比,则相对于windowHeight,传"10%"则等于windowHeight的10%
			let rate = Number(num.replace('%', '')) / 100;
			return windowHeight * rate;
		}
	}
	return num ? uni.upx2px(Number(num)) : 0;
};

utils['formatTime'] = (duration = 0) => {
	duration = duration >= 0 ? duration * 1 : 0;
	const m = (Math.floor(duration / 60) + '').padStart(2, '0')
	const s = (Math.floor(duration % 60) + '').padStart(2, '0')
	return `${m}:${s}`
};

utils['addTimestamps'] = (...times) => {
	let duration = 0;
	
	times.forEach(time => {
		if (time) {  // 忽略空字符串
			const parts = time.split(':').map(Number);
			if (parts.length === 3) {
				// 格式为 hh:mm:ss
				const [hours, min, sec] = parts;
				duration += (hours * 3600) + (min * 60) + sec;
			} else if (parts.length === 2) {
				// 格式为 mm:ss
				const [min, sec] = parts;
				duration += (min * 60) + sec;
			} else {
				duration += sec;
			}
		}
	});

	// 将总秒数转换为小时、分钟和秒
	const h = (Math.floor(duration / 60 / 60) + '').padStart(2, '0');
	const m = (Math.floor(duration / 60) + '').padStart(2, '0');
	const s = (Math.floor(duration % 60) + '').padStart(2, '0');
	
	return `${ h != '00' ? h + ':' : ''}${m}:${s}`
};

utils['isValidEmail'] = (email) => {
	const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
	
	return emailRegex.test(email);
}

// 切割字符串,将需要朗读的文案切割请求,避免过长的请求等待
utils['splitStringByLength'] = (text, limit = 100) => {
	let result = [];
    let start = 0;

    while (start < text.length) {
        let end = start + limit;

        // 如果 end 超出文本长度，则调整 end 到文本末尾
        if (end >= text.length) {
            result.push(text.slice(start));
            break;
        }

        // 检查切割位置的末尾是否是标点符号
        if (/[,，。！!?]/.test(text[end])) {
            result.push(text.slice(start, end + 1));
            start = end + 1;
        } else {
            // 向后寻找最近的标点符号
            let sliceEnd = text.slice(end);
            let punctEnd = sliceEnd.search(/[,，。！!?]/);

            if (punctEnd !== -1) {
                punctEnd += end; // 获取标点符号的实际位置

                if (punctEnd - start > limit * 2) {
                    // 如果标点符号距离超过 limit 的两倍
                    // 调整 end 不超过 limit * 2，避免过长的切割
                    end = Math.min(punctEnd, start + limit * 2);
                } else {
                    end = punctEnd;
                }
                
                // 确保不会在英文单词中间切割
                while (end > start && /\S/.test(text[end]) && !/[,，。！!?]/.test(text[end])) {
                    end--;
                }
                result.push(text.slice(start, end + 1));
                start = end + 1;
            } else {
                // 如果没有找到标点符号，则检查是否在英文单词中间
                while (end > start && /\S/.test(text[end]) && !/[,，。！!?]/.test(text[end])) {
                    end--;
                }
                result.push(text.slice(start, end));
                start = end;
            }
        }
    }

    return result;
}

utils['urlSearchParams'] = (obj) => {
	return Object.keys(obj)
			.filter(key => obj[key] !== undefined && obj[key] !== null && obj[key] !== '')
			.map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]))
			.join('&');
}

// 版本号比对，以此来判断版本是否落后
utils['compareVersions'] = (version1, version2) => {
    const arr1 = String(version1).split('.').map(Number);
    const arr2 = String(version2).split('.').map(Number);
    const maxLength = Math.max(arr1.length, arr2.length);

    for (let i = 0; i < maxLength; i++) {
        const num1 = arr1[i] || 0;
        const num2 = arr2[i] || 0;

        if (num1 > num2) {
            return 1;
        } else if (num1 < num2) {
            return -1;
        }
    }

    return 0;
}

utils['removeMarkdownTags'] = (str, flag) => {
	// 去掉 Markdown 标签（如 **，__，*，_，# 等）
	// return str.replace(/[\w]*(\*+|#+|>+|`+|\-+|\++|~~+)/g, '');
	
	if (!flag) {
		// 保留 H1~H6 的 Markdown 转换为 HTML
		str = str.replace(/^\s*(#{1,6})\s*(.+?)\s*$/gm, (match, p1, p2) => {
			const level = p1.length;
			return `<h${level}>${p2}</h${level}>`;
		});
		// str = str.replace(/^(#{1,6})\s*(.+)$/gm, (match, p1, p2) => {
		// 	const level = p1.length;
		// 	return `<h${level}>${p2}</h${level}>`;
		// });

		// 保留加粗 ** 或 __
		str = str.replace(/(\*\*|__)(.*?)\1/g, '<b>$2</b>'); // 加粗

		// 保留斜体 * 或 _
		str = str.replace(/(\*|_)(.*?)\1/g, '<i>$2</i>'); // 斜体
		
		// 去掉其他不必要的 Markdown 标签
		str = str.replace(/~~(.*?)~~/g, ''); // 删除线
		str = str.replace(/`([^`]+)`/g, ''); // 行内代码
		str = str.replace(/```[\s\S]*?```/g, ''); // 代码块
		str = str.replace(/(?:^|\n)[-*+]\s+(.+?)(?=\n|$)/g, (match, p1) => {
		    return `\n${p1}\n`; // 去掉无序列表
		});
	} else {
		str = str.replace(/[\w]*(\*+|#+|>+|`+|\-+|\++|~~+)/g, '');
	}
	
	return str;
	// return str.replace(/(\*\*|__|\*|_|`|~~|#+|\[|\]|\(|\))/g, '');
}

// 按照指定字符串分割字符
utils['splitString'] = (str, splitStr) => {
	if(str){
		return str.split(splitStr)
	}else{
		return []
	}
	
}

export { utils };